import time

import win32api
import win32con
import win32gui
from pynput.keyboard import Key, Controller

'''该python文件使用 pywin32以及 pynput 实现了简单的企业微信自动添加客户的功能'''




'''获取企业微信窗口，并显示在前方，要求必须打开企业微信软件，并登陆'''
def get_and_front_workwx_win():
    # 第一个参数为classname，第二个参数为title, 这两个参数可以通过spy++进行查找获取
    work_wx = win32gui.FindWindow('WeWorkWindow', '企业微信')
    # 显示窗口，若不显示可能无法将窗口放到最前
    win32gui.ShowWindow(work_wx, win32con.SW_SHOWNORMAL)
    # 将窗口放到最前
    win32gui.SetForegroundWindow(work_wx)

    return work_wx


'''打开通讯录界面'''
def open_txl_page(win):
    # 获取窗口位置以及大小，返回值是一个数组，包含四个元素，分别是左上x坐标 左上y坐标，右下x坐标，右下y坐标
    rect = win32gui.GetWindowRect(win)
    x = rect[0]
    y = rect[1]
    w = rect[2] - x
    h = rect[3] - y
    print("Window %s:" % win32gui.GetWindowText(win))
    print("\tLocation: (%d, %d)" % (x, y))
    print("\t    Size: (%d, %d)" % (w, h))
    # 移动鼠标到企业微信窗口的通讯录菜单，并点击
    win32api.SetCursorPos([x+30, y+150])
    #模拟鼠标左键按下和放开
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

    time.sleep(0.01)

    # 移动鼠标到企业微信窗口的通讯录--》新的客户，并点击
    win32api.SetCursorPos([x+100, y+100])
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )

    time.sleep(0.01)

    # 移动鼠标到企业微信窗口的通讯录--》新的客户--》添加，并点击
    win32api.SetCursorPos([x+w-50, y+50])
    # 模拟鼠标左键按下。
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
    time.sleep(0.1)


'''获取添加好友的窗口，并显示在前面'''
def get_add_user_win():
    # 第一个参数为classname，第二个参数为title, 这两个参数可以通过spy++进行查找获取
    add_user_win = win32gui.FindWindow('SearchExternalsWnd', '添加客户')
    # 显示窗口，若不显示可能无法将窗口放到最前
    win32gui.ShowWindow(add_user_win, win32con.SW_SHOWNORMAL)
    # 将窗口放到最前
    #win32gui.SetForegroundWindow(add_user_win)
    return add_user_win



'''输入手机号，搜索，点击添加按钮'''
def input_search_click_add(add_user_win):
    pos = get_win_pos(add_user_win)
    #定位到输入框，并点击使得输入框获取焦点
    win32api.SetCursorPos([pos['x']+100, pos['y']+90])
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
    time.sleep(0.01)
    # 键盘事件，直接输入字符串
    keyboard = Controller()
    keyboard.type('13625655981')

    # 回车
    keyboard.press(Key.enter)

    keyboard.release(Key.enter)

    # 睡眠一会等待查询结果
    time.sleep(2)

    # 判断是否出现该用户不存在的窗口，如果出现则说明用户不存在
    isExist = judege_user_exist()
    if(isExist is True):
        print("该用户不存在")
    else:
        print("用户存在，开始添加好友")
        # 将鼠标移动到添加按钮，并点击
        win32api.SetCursorPos([pos['x']+316, pos['y']+190])
        # 模拟鼠标左键按下。
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )

def get_send_friend_invite_win():
    # 第一个参数为classname，第二个参数为title, 这两个参数可以通过spy++进行查找获取
    send_friend_invite_win = win32gui.FindWindow('InputReasonWnd', '输入认证信息')
    # 显示窗口，若不显示可能无法将窗口放到最前
    win32gui.ShowWindow(send_friend_invite_win, win32con.SW_SHOWNORMAL)
    # 将窗口放到最前
    #win32gui.SetForegroundWindow(send_friend_invite_win)
    #send_friend_invite(send_friend_invite_win)
    return send_friend_invite_win



def send_friend_invite(win):
    pos = get_win_pos(win)
    win32api.SetCursorPos([pos['x']+int(pos['w']/2), pos['y']+165])
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )



'''如果搜索的用户不存在则会出现用户不存在的对话框'''
def judege_user_exist():
    hWndList = []
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    for hwnd in hWndList:
        clsname = win32gui.GetClassName(hwnd)
        title = win32gui.GetWindowText(hwnd)
        if (title.find('该用户不存在') > 0):
            return True
        else:
            return False




'''获取窗口左上角的位置以及长宽'''
def get_win_pos(win):
    # 获取窗口位置以及大小
    rect = win32gui.GetWindowRect(win)
    x = rect[0]
    y = rect[1]
    w = rect[2] - x
    h = rect[3] - y
    print("Window %s:" % win32gui.GetWindowText(win))
    print("\tLocation: (%d, %d)" % (x, y))
    print("\t    Size: (%d, %d)" % (w, h))
    return {'x':x,'y':y,'w':w,'h':h}



if __name__=='__main__':
    work_wx = get_and_front_workwx_win()
    open_txl_page(work_wx)
    time.sleep(1)
    add_user_win = get_add_user_win()
    input_search_click_add(add_user_win)
    time.sleep(1)
    send_friend_invite_win = get_send_friend_invite_win()
    send_friend_invite(send_friend_invite_win)

    # 休眠一会关闭添加好友的窗口
    time.sleep(2)
    win32gui.CloseWindow(add_user_win)
